package com.desay.pangoo.itmt.service;

import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Set;

import javax.servlet.http.HttpServletResponse;

import org.springframework.data.domain.Page;
import org.springframework.web.multipart.MultipartFile;

import com.alibaba.fastjson.JSONObject;
import com.desay.pangoo.itmt.controller.vo.TechOnlineReviewAttendVo;
import com.desay.pangoo.itmt.controller.vo.TechOnlineReviewRelevantVo;
import com.desay.pangoo.itmt.controller.vo.TechOnlineReviewTMTVo;
import com.desay.pangoo.itmt.controller.vo.TechOnlineReviewVo;
import com.desay.pangoo.itmt.entity.TechOnlineReviewEntity;

/**
 * 
 * @author uidq1163
 *
 */
public interface TechOnLineReviewService {

	/**
	 * 分页查询
	 * @param workGroupId
	 *            工作组分类ID
	 * @param isCross
	 *            是否跨域
	 * @param creator
	 *            提案申请者
	 * @param isDisruptive
	 *            是否颠覆性技术
	 * @param reviewResult
	 *            评审结果
	 * @param proposalName
	 *            提案名称
	 * @param reviewProcess
	 *            评审状态
	 * @param subsidiary
	 *            子技术
	 * @param description
	 *            技术描述
	 * @param techLevel
	 *            技术等级
	 * @param roadMap
	 *            技术路线
	 * @param startDueDate
	 *            截止开始时间
	 * @param endDueDate
	 *            截止结束时间
	 * @param pageNo
	 *            分页页码
	 * @param pageSize
	 *            分页大小
	 * @param reviewType
	 *            技术类型
	 * @param ptn
	 *    		  技术编号
	 * @param responsible
	 * 	  		  责任人提案编号
	 * @param IsPlReview
	 *  	  	  是否是PLTMT技术课题注册的提案交付
	 * @param finalTechnologyLeadership
	 * 			  最终领先度得分
	 * @param finalTechnologyContribution
	 * 			  最终贡献度得分
	 * @return
	 */
	Page<TechOnlineReviewEntity> getList(String ptn, String reviewProcess, List<Integer> reviewType, Long workGroupId,
										 Boolean isCross, String creator, Boolean isDisruptive, Boolean reviewResult, String proposalName,
										 String subsidiary, String description, Integer techLevel, String roadMap, Date startDueDate,
										 Date endDueDate, Integer pageNo, Integer pageSize, Set<String> responsible, Boolean IsPlReview,Integer finalTechnologyLeadership,Integer finalTechnologyContribution);

	/**
	 * 提交
	 * 
	 * @param vo
	 * @return
	 */
	Object create(TechOnlineReviewVo vo);

	/**
	 * 关联性反馈
	 * 
	 * @param vo
	 * @param isAdmin
	 * @return
	 */
	Object relevant(Boolean isAdmin, TechOnlineReviewRelevantVo vo);

	/**
	 * TMT 评审
	 * 
	 * @param vo
	 * @return
	 */
	void tmtReview(TechOnlineReviewTMTVo vo);

	/**
	 * 上传文件，返回文件id
	 * 
	 * @param file
	 * @param fileType
	 * @return
	 * @throws IOException
	 */
	Object uploadFile(MultipartFile[] file, String fileType) throws IOException;

	/**
	 * 删除文件
	 * 
	 * @param id
	 */
	void deleteFile(Long id);

	/**
	 * 下载文件
	 * 
	 * @param id
	 * @param resp
	 */
	void downloadFile(Long id, HttpServletResponse resp);
	/**
	 * 下载文件
	 *
	 * @param id
	 * @param vo
	 */
	void update(Long id, TechOnlineReviewVo vo);

	/**
	 * 手动推送邮件
	 * 
	 * @param id
	 */
	void pushMail(Long id);

	/**
	 * 根据id获取提案相关信息
	 * 
	 * @param id
	 * @return
	 */
	Object getInfoById(Long id);

	/**
	 * 根据id获取提案相关反馈信息
	 * 
	 * @param id
	 * @return
	 */
	Object getRelevantInfoById(Long id);

	/**
	 * 根据id获取提案TMT审核信息
	 * 
	 * @param id
	 * @return
	 */
	Object getTmtReviewList(Long id);

	/**
	 * 申请评审信息
	 * 
	 * @param reviewId
	 * @return
	 */
	Object participateRateInfo(Long reviewId);

	/**
	 * 获取文件列表
	 * 
	 * @param fileType
	 * @return
	 */
	Object getFileList(String fileType);

	/**
	 * 更新TMT参会人员，只有参会的人员才会有评审权限
	 * 
	 * @param vo
	 *            TMT参会列表id
	 */
	void updateTmtAttendReviewMeeting(TechOnlineReviewAttendVo vo);

	/**
	 * 获取历史评审记录：包含
	 * 
	 * @param reviewType
	 * @param techId
	 *            技术课题id
	 * @return
	 */
	List<TechOnlineReviewEntity> getHistoryList(Integer reviewType, List<Long> techId);

	/**
	 * 开始评审
	 * 
	 * @param id
	 * @return
	 */
	Object openView(Long id);

	/**
	 * 管理看板【TMT专家评审榜单】，当前季度&上一季度两个榜单，按人参与评审次数从高到底排序
	 * 
	 * @return
	 */
	List<JSONObject> countExpertRviewListTmtInfo();

	/**
	 * 月度数据（已评审完成时间为准）（可选年份），规划/定义/交付三类，通过/不通过数量的堆积柱状图
	 * 
	 * @param yearMonth
	 * @param reviewType
	 * @return
	 */
	Object monthlyProgressChart(String yearMonth, Integer reviewType);
}
